export const isObject = (d) => typeof d === 'object'
export const isArray = (d) => d instanceof Array
export const isString = (d) => typeof d === 'string'
export const isNumber = (d) => typeof d === 'number'
export const isFunction = (d) => typeof d === 'function'

export const wrapArray = (d) => isArray(d) ? d : [d]

// 兼容
export const indexedDB =
  window.indexedDB ||
  window.mozIndexedDB ||
  window.webkitIndexedDB ||
  window.msIndexedDB

export const IDBTransaction =
  window.IDBTransaction ||
  window.webkitIDBTransaction ||
  window.msIDBTransaction

export const IDBKeyRange =
  window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange

export const ACCESS_MODE = {
  /**
   * 只读
   */
  Readonly: 'read',
  /**
   * 读写
   */
  ReadWrite: 'readwrite',
  /**
   * 只有Firfox支持
   */
  ReadWriteFlush: 'readwriteflush', // firefox only
}

export const TRANSACTION_MODE = {
  /**
   * 默认模式
   */
  Default: 'default',
  /**
   * 严格模式
   */
  Strict: 'strict',
  /**
   * 轻松模式，对数据要求不严格，追求性能时可用该模式
   */
  Relaxed: 'relaxed',
}

export const CURSOR_DIRECTION = {
  /**
   * 从数据源开始位置遍历
   */
  Next: 'next',
  /**
   * 从数据源开始遍历；当取值有重复时，只获取一次
   */
  NextUnique: 'nextunique', 
  /**
   * 从数据源的最后位置位置开取值
   */
  prev: 'prev',
  /**
   * 从数据源的最后位置开始取值，只获取一次
   */
  PrevUnique: 'prevunique'
}

/**
 * 用于创建IDBKeyRange参数
 */
export const DBKeyRangeOperator = {
  /**
   * <
   */
  小于: (x) => {
    return IDBKeyRange.upperBound(x, true)
  },

  /**
   * <=
   */
  小于等于: (x) => {
    return IDBKeyRange.upperBound(x)
  },

  /**
   * >
   */
  大于: (x) => {
    return IDBKeyRange.lowerBound(x, true)
  },
  
  /**
   * >=
   */
  大于等于: (x) => {
    return IDBKeyRange.lowerBound(x)
  },

  /**
   * >= && <=
   */
  左闭右闭: (x, y) => {
    return IDBKeyRange.bound(x, y)
  },

  /**
   * > && <
   */
  左开右开: (x, y) => {
    return IDBKeyRange.lowerBound(x, y, true, true)
  },

  /**
   * > && <=
   */
  左开右闭: (x, y) => {
    return IDBKeyRange.lowerBound(x, y, true, false)
  },

  /**
   * >= & <
   */
  左闭右开: (x, y) => {
    return IDBKeyRange.lowerBound(x, y, false, true)
  },

  /**
   * ===
   */
  等于: (x) => {
    return IDBKeyRange.only(x)
  },
}

export default {
  indexedDB,
  IDBTransaction,
  IDBKeyRange,
}
